/*
 * Copyright (C) 2011 The Code Bakers
 * Authors: Cleuton Sampaio e Francisco Rodrigues
 * e-mail: thecodebakers@gmail.com
 * Project: http://code.google.com/p/biomagohc/
 * Site: http://www.thecodebakers.org
 *
 * Licensed under the GNU GPL, Version 3.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://gplv3.fsf.org/
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * @author Cleuton Sampaio e Francisco Rogrigues - thecodebakers@gmail.com
 */

package br.com.thecodebakers.biomago.graphics;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import br.com.thecodebakers.biomago.model.BioPlot;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

public class BioGraphicView extends View {

	private static final String TAG = "BioGraphicView";
	private Paint paint = new Paint();
	private Paint titlePaint = new Paint();
	private List<BioPlot> lista;
	private String nome;
	private String data;
	private Date hoje;
	private String hojeString;
	private String titBio;
	private String titNascimento;
	private String titDataInicial;
	private String titEmocional;
	private String titIntelectual;
	private String titFisico;
	private String mensagem;
	private Bitmap fundo;
	
	private void init() {
		this.setVisibility(VISIBLE);
		paint.setColor(Color.BLUE);
		paint.setStrokeWidth(3);
		titlePaint.setColor(Color.BLACK);
		this.setBackgroundColor(Color.WHITE);
		hoje = new Date();
		SimpleDateFormat sdf = (SimpleDateFormat) SimpleDateFormat.getDateInstance();
		sdf.applyPattern("dd/MM/yyyy");
		hojeString = sdf.format(hoje);
	}
	
	public BioGraphicView(Context context) {
        super(context);
        init();
	}

	public BioGraphicView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}

	public BioGraphicView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public void setLista(List<BioPlot> lista) {
		this.lista = lista;
	}

	@Override
    public void onDraw(Canvas canvas) {
		
		// Nós já desenhamos isso? Então vamos usar o que já temos!
	
		if (this.fundo != null) {
			canvas.drawBitmap(fundo, 0, 0, titlePaint);
			return;
		}
		
		this.fundo = Bitmap.createBitmap( canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888); 
		this.fundo.setDensity(canvas.getDensity());
		
		Canvas kanvas = new Canvas(this.fundo);
		kanvas.drawARGB(255, 255, 255, 255); // Colorir o bitmap de fundo 
		
		// Pega os strings de acordo com o locale:
		// Escreve o cabeçalho: 
		titlePaint.setColor(Color.BLACK);
		String linha1 = this.titBio + " " + nome;
		String linha2 = this.titNascimento + " " + data;
		String linha3 = this.titDataInicial + " " + hojeString;
		kanvas.drawText(linha1, 0, 15, titlePaint);
		kanvas.drawText(linha2, 0, 30, titlePaint);
		kanvas.drawText(linha3, 0, 45, titlePaint);
		

		
		// Obtem limites da tela:
		Rect limite = kanvas.getClipBounds();
		double dx = (limite.right - limite.left); 			// Largura da viewport
		double dy = (limite.bottom - limite.top); 			// Altura da viewport
		
		// Não queremos ocupar toda a altura disponível, deixando um espaço de 130 pixels no topo
		int espacoInicio = 160;
		int beginLines = 90;
		dy = dy - espacoInicio;
		
		// Calcula os valores para fazer a escala:
		double scaleY = (dy < 200) ? (dy / 200) : (200 / dy);
		double scaleX = (dx / 35);

		
		// Escreve a legenda:
		double begin = 60;
		titlePaint.setTypeface(Typeface.DEFAULT_BOLD);
		titlePaint.setColor(Color.BLUE);
		kanvas.drawText(this.titEmocional.toUpperCase(), 0, (float) begin, titlePaint);
		titlePaint.setColor(Color.BLACK);
		kanvas.drawText(this.mensagem, 0, (float) begin + 15, titlePaint);
		titlePaint.setColor(Color.RED);
		float xWidth = (float) (dx - 20);
		float textSize = titlePaint.measureText(this.titFisico);
		float xPosition = (float) ((xWidth / 2) - (textSize / 2));
		kanvas.drawText(this.titFisico.toUpperCase(), xPosition, (float) begin, titlePaint);
		textSize = titlePaint.measureText(this.titIntelectual);
		xPosition = (float) (xWidth - textSize);
		titlePaint.setColor(Color.GREEN);
		kanvas.drawText(this.titIntelectual.toUpperCase(), xPosition, (float) begin, titlePaint);

		
		Paint daysPaint = new Paint();
		daysPaint.setColor(Color.MAGENTA);
		
		
		// Loop de marcação dos pontos e desenho das retas:
		daysPaint.setStrokeWidth(3);
		double incX = scaleX;		
		kanvas.drawLine((float)incX, beginLines, (float)incX, (float) ((float) espacoInicio + (dy - 35)) , daysPaint);
		
		daysPaint.setStrokeWidth(0.0f);
		daysPaint.setColor(Color.LTGRAY);
		
		double x = 0.0; 
		BioPlot anter = null;
		boolean primeiro = true;
		int nDia = 0;
		for (BioPlot bp : this.lista) {
			// Procedimento para cada ponto:
			x = x + incX;
			nDia++;
			// Transformação na escala
			double emocional = (float) (bp.getEmocional() * scaleY);
			double fisico = (float) (bp.getFisico() * scaleY);
			double intelectual = (float) (bp.getIntelectual() * scaleY);
			
			// Translação do gráfico (inverter e somar a altura da escala:
			emocional = (emocional * -1)  + espacoInicio;
			fisico = (fisico * -1)  + espacoInicio;
			intelectual = (intelectual * -1)  + espacoInicio;
			
			// Guarda o "Y" convertido:
			bp.setEmocional(emocional);
			bp.setFisico(fisico);
			bp.setIntelectual(intelectual);
			
			if (primeiro) {
				primeiro = false;
			}
			else {
				paint.setColor(Color.BLUE);
				kanvas.drawLine((float) (x - incX), (float) anter.getEmocional(), (float) (x), (float) emocional, paint);
				paint.setColor(Color.RED);
				kanvas.drawLine((float) (x - incX), (float) anter.getFisico(), (float) (x), (float) fisico, paint);
				paint.setColor(Color.GREEN);
				kanvas.drawLine((float) (x - incX), (float) anter.getIntelectual(), (float) (x), (float) intelectual, paint);
				if ((nDia % 7) == 0) {
					daysPaint.setColor(Color.BLACK);
				}
				else {
					daysPaint.setColor(Color.LTGRAY);
				}
				kanvas.drawLine((float)x, beginLines, (float)x, (float) ((float) espacoInicio + (dy - 35)) , daysPaint);
			}
			
			anter = bp;
		}
		
		canvas.drawBitmap(fundo, 0, 0, daysPaint);
		
    }
	
	public String getNome() {
		return nome;
	}


	public void setNome(String nome) {
		if (nome.length() > 22) {
			nome = nome.substring(0, 21) + "...";
		}
		this.nome = nome;
	}

	public String getData() {
		return data;
	}

	public void setData(String data) {
		this.data = data;
	}

	public List<BioPlot> getLista() {
		return lista;
	}

	public String getTitBio() {
		return titBio;
	}

	public void setTitBio(String titBio) {
		this.titBio = titBio;
	}

	public String getTitNascimento() {
		return titNascimento;
	}

	public void setTitNascimento(String titNascimento) {
		this.titNascimento = titNascimento;
	}

	public String getTitDataInicial() {
		return titDataInicial;
	}

	public void setTitDataInicial(String titDataInicial) {
		this.titDataInicial = titDataInicial;
	}

	public String getTitEmocional() {
		return titEmocional;
	}

	public void setTitEmocional(String titEmocional) {
		this.titEmocional = titEmocional;
	}

	public String getTitIntelectual() {
		return titIntelectual;
	}

	public void setTitIntelectual(String titIntelectual) {
		this.titIntelectual = titIntelectual;
	}

	public String getTitFisico() {
		return titFisico;
	}

	public void setTitFisico(String titFisico) {
		this.titFisico = titFisico;
	}

	public String getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}

	public Bitmap getFundo() {
		return fundo;
	}

	public void setFundo(Bitmap fundo) {
		this.fundo = fundo;
	}

	

}
